package com.sprouting.personal.controller;

import cn.hutool.core.io.FileUtil;
import com.sprouting.personal.model.common.ResultJson;
import com.sprouting.personal.model.entity.UploadFile;
import com.sprouting.personal.service.UploadFileService;
import com.sprouting.personal.utils.CheckTool;
import com.sprouting.personal.utils.IdTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 文件上传
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/9/17 9:01
 */
@RequestMapping("/uploading")
@RestController
@Slf4j
public class UploadFileController {

    @Autowired
    private UploadFileService uploadFileService;


    /**
     * 文件存储基础路径
     */
    @Value("${upload.data.base.path}")
    private String basePath;


    /**
     * 获取标记，这个标记用来解决同一组图片上传的问题
     *
     * 方案1
     * 做法是这样的，进入一个新增页面后，先获取一个标记，然后前期的新增与这个标记一起提交，放到临时文件中
     * 当提交的时候，把临时文件中需要提交的图片一起放到正式位置，这个迁移过程还要进行一次清洗数据
     * 这个方案最大的问题是要进行一次迁移，还需要每次定时的进行数据的清理。但这个清理过程是非常简单的，以及可能需要解决
     * 迁移图片后的回显问题
     *
     * 方案2
     * 还是进入页面后获取标记，然后提交的时候直接放入到正式环境中。将上传的图片进行记录，到时候进行一次扫描处理旧文件
     *
     * 方案3 - 采用的现有方案
     * 进入页面，获取一个ID，提交图片的时候，将ID和图片一起提交。将其保存在正式环境，通过 UploadFile 对象记录，这个表
     * 增加了一个字段，temp，用来标记是否临时文件，每过10分钟运行一次检测，发现表中temp的已经超过一天，则删除这些旧数据
     *
     * @return
     */
    @GetMapping("/getFlag")
    public ResultJson getFlag(){
        return ResultJson.success(IdTool.getId());
    }

    /**
     * 删除上传的文件
     * @param path 上传文件路径
     * @return
     */
    @PostMapping("/delImage")
    public ResultJson delImage(String path){
        if (CheckTool.checkNull(path)){
            return ResultJson.errorIllegal();
        }

        UploadFile uploadFile = uploadFileService.getUploadFileBySavePath(path);
        if (uploadFile == null){
            return ResultJson.success();
        }

        // 处理文件
        String savePath = uploadFile.getSavePath();

        // 做容错措施，如果是目录，不进行操作，数据非常重要，一定要多检查
        if (FileUtil.isFile(basePath + savePath)){
            FileUtil.del(basePath + savePath);

            uploadFileService.removeById(uploadFile.getId());
            return ResultJson.success();

        } else {
            log.error("要删除的是数据是目录，跳过该删除操作：{}", basePath + savePath);

            uploadFile.setFileInfo("无法直接删除目录，不允许该操作");
            uploadFileService.updateById(uploadFile);
            return ResultJson.success();
        }
    }

    /**
     * 单独删除一个上传的文件
     * @param idUploadFile 文件id
     * @return
     */
    // @PostMapping("/delShoppingCartImages")
    // public ResultJson delShoppingCartImages(String idUploadFile){
    //     if (CheckTool.checkNull(idUploadFile)){
    //         return ResultJson.errorIllegal();
    //     }
    //
    //     UploadFile uploadFile = uploadFileService.getUploadFileById(idUploadFile);
    //     uploadFileService.removeById(uploadFile.getId());
    //
    //     // 处理文件
    //     String savePath = uploadFile.getSavePath();
    //     if (!CheckTool.checkNull(savePath)){
    //         // 做容错措施，如果是目录，不进行操作，数据非常重要，一定要多检查
    //         if (FileUtil.isFile(basePath + savePath)){
    //             FileUtil.del(basePath + savePath);
    //         } else {
    //             log.error("要删除的是数据是目录，跳过该删除操作：{}", basePath + savePath);
    //         }
    //     }
    //
    //     return ResultJson.success(null);
    // }

}
